package com.cw.jeeyt.service.impl.api;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.cw.base.common.model.util.AppParamUtil;
import com.cw.jeeyt.common.enums.EnumOperateType;
import com.cw.jeeyt.service.intf.api.ApiDatabaseService;
import com.cw.jeeyt.service.bo.api.ApiDatabaseBo;
import com.cw.jeeyt.service.bo.security.SecurityUserBo;
import com.cw.jeeyt.core.util.SessionUtil;
import com.cw.jeeyt.dao.intf.api.ApiDatabaseDao;
import com.cw.jeeyt.dao.model.api.ApiDatabaseDo;
import com.cw.jeeyt.service.converter.api.ApiDatabaseConverter;
import com.cw.lang.common.log.Log;
import com.cw.lang.common.log.TenantLog;
import com.cw.lang.common.utils.GsonUtil;
import com.cw.lang.common.utils.IdGenerator;
import com.cw.lang.common.utils.PageUtil;
import com.cw.lang.mybatis.dto.PageInfo;

/**
 * 数据库业务实现类
 *
 * @author: chenw
 * @create: 2018-11-25 16:12
 */
@Service
public class ApiDatabaseServiceImpl implements ApiDatabaseService {
    private Log log = TenantLog.getLogger(ApiDatabaseServiceImpl.class);
    @Autowired
    private ApiDatabaseDao apiDatabaseDao;

    /**
     * 分页查询数据库信息
     *
     * @param apiDatabaseBo 查询条件
     * @param pageNum 当前页
     * @param pageSize 每页长度
     * @return
     */
    @Override
    public PageInfo<ApiDatabaseBo> queryPageInfo(ApiDatabaseBo apiDatabaseBo, Integer pageNum, Integer pageSize) {
        ApiDatabaseDo queryData = ApiDatabaseConverter.bo2Do(apiDatabaseBo);
        initCommonInfo(queryData, EnumOperateType.QUERY);
        PageInfo<ApiDatabaseDo> pageInfo = apiDatabaseDao.queryPageInfo(queryData,
            PageUtil.calStartIndex(pageNum, pageSize), pageSize);
        return new PageInfo<>(pageInfo, ApiDatabaseConverter.doList2BoList(pageInfo.getList()));
    }

    /**
     * 根据条件查询数据库信息
     *
     * @param apiDatabaseBo 查询条件
     * @return
     */
    @Override
    public List<ApiDatabaseBo> queryList(ApiDatabaseBo apiDatabaseBo) {
        ApiDatabaseDo queryData = ApiDatabaseConverter.bo2Do(apiDatabaseBo);
        initCommonInfo(queryData, EnumOperateType.QUERY);
        return ApiDatabaseConverter.doList2BoList(apiDatabaseDao.queryList(queryData));
    }

    /**
     * 根据主键查询数据库信息
     *
     * @param apiDatabaseBo
     * @return
     */
    @Override
    public ApiDatabaseBo getById(ApiDatabaseBo apiDatabaseBo) {
        ApiDatabaseDo queryData = ApiDatabaseConverter.bo2Do(apiDatabaseBo);
        initCommonInfo(queryData, EnumOperateType.QUERY);
        return ApiDatabaseConverter.do2Bo(apiDatabaseDao.getById(queryData));
    }

    /**
     * 新增数据库信息
     *
     * @param apiDatabaseBo
     * @return
     */
    @Override
    @Transactional
    public boolean insert(ApiDatabaseBo apiDatabaseBo) {
        if (apiDatabaseBo == null) {
            log.error("没有要新增的数据");
            return false;
        }
        log.info("新增数据库信息，入参：{}", GsonUtil.objectToJsonString(apiDatabaseBo));
        ApiDatabaseDo apiDatabaseModel = ApiDatabaseConverter.bo2Do(apiDatabaseBo);
        initCommonInfo(apiDatabaseModel, EnumOperateType.ADD);
        //新增数据库信息
        return apiDatabaseDao.insert(apiDatabaseModel) > 0;
    }

    /**
     * 新增不为null的数据库信息
     *
     * @param apiDatabaseBo
     * @return
     */
    @Override
    @Transactional
    public boolean insertSelective(ApiDatabaseBo apiDatabaseBo) {
        if (apiDatabaseBo == null) {
            log.error("没有要新增的数据");
            return false;
        }
        ApiDatabaseDo apiDatabaseModel = ApiDatabaseConverter.bo2Do(apiDatabaseBo);
        //初始化基础数据
        initCommonInfo(apiDatabaseModel, EnumOperateType.ADD);
        //新增数据库信息
        return apiDatabaseDao.insertSelective(apiDatabaseModel) > 0;
    }

    /**
     * 批量新增数据库信息
     *
     * @param apiDatabaseBos
     * @return
     */
    @Override
    @Transactional
    public boolean insertBatch(List<ApiDatabaseBo> apiDatabaseBos) {
        if (apiDatabaseBos == null || apiDatabaseBos.isEmpty()) {
            log.error("没有要新增的数据");
            return false;
        }
        List<ApiDatabaseDo> apiDatabaseModels = ApiDatabaseConverter.boList2DoList(apiDatabaseBos);
        apiDatabaseModels.forEach(apiDatabaseModel -> {
            initCommonInfo(apiDatabaseModel, EnumOperateType.ADD);
        });
        //新增数据库信息
        return apiDatabaseDao.insertBatch(apiDatabaseModels) > 0;
    }

    /**
     * 修改数据库信息
     *
     * @param apiDatabaseBo
     * @return
     */
    @Override
    @Transactional
    public boolean update(ApiDatabaseBo apiDatabaseBo) {
        if (apiDatabaseBo == null) {
            log.error("没有要修改的数据");
            return false;
        }
        log.info("修改数据库信息，入参：{}", GsonUtil.objectToJsonString(apiDatabaseBo));
        ApiDatabaseDo apiDatabaseModel = ApiDatabaseConverter.bo2Do(apiDatabaseBo);
        initCommonInfo(apiDatabaseModel, EnumOperateType.UPDATE);
        return apiDatabaseDao.update(apiDatabaseModel) > 0;
    }

    /**
     * 批量修改数据库信息
     *
     * @param apiDatabaseBos
     * @return
     */
    @Override
    @Transactional
    public boolean updateBatch(List<ApiDatabaseBo> apiDatabaseBos) {
        if (apiDatabaseBos == null) {
            log.error("没有要修改的数据");
            return false;
        }
        log.info("批量修改数据库信息，入参：{}", GsonUtil.objectToJsonString(apiDatabaseBos));
        List<ApiDatabaseDo> apiDatabaseModels = ApiDatabaseConverter.boList2DoList(apiDatabaseBos);
        apiDatabaseModels.forEach(apiDatabaseModel -> {
            initCommonInfo(apiDatabaseModel, EnumOperateType.UPDATE);
        });
        return apiDatabaseDao.updateBatch(apiDatabaseModels) > 0;
    }

    /**
     * 修改不为null的数据库信息
     *
     * @param apiDatabaseBo
     * @return
     */
    @Override
    @Transactional
    public boolean updateSelective(ApiDatabaseBo apiDatabaseBo) {
        if (apiDatabaseBo == null) {
            log.error("没有要修改的数据");
            return false;
        }
        ApiDatabaseDo apiDatabaseModel = ApiDatabaseConverter.bo2Do(apiDatabaseBo);
        initCommonInfo(apiDatabaseModel, EnumOperateType.UPDATE);
        return apiDatabaseDao.updateSelective(apiDatabaseModel) > 0;
    }

    /**
     * 根据主键删除数据库信息
     *
     * @param apiDatabaseBo
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean deleteById(ApiDatabaseBo apiDatabaseBo) {
        if (apiDatabaseBo == null || apiDatabaseBo.getId() == null) {
            log.error("参数有误，请检查");
            return false;
        }
        ApiDatabaseDo apiDatabaseModel = ApiDatabaseConverter.bo2Do(apiDatabaseBo);
        initCommonInfo(apiDatabaseModel, EnumOperateType.DELETE);
        return apiDatabaseDao.deleteById(apiDatabaseModel) > 0;
    }

    /**
     * 初始化基础数据
     *
     * @return
     */
    private void initCommonInfo(ApiDatabaseDo apiDatabaseModel, EnumOperateType operateType) {
        //渠道号
        apiDatabaseModel.setChannelNo(AppParamUtil.getChannelNo());
        //获取当前登录用户
        SecurityUserBo securityUserBo;
        if (EnumOperateType.ADD == operateType) {
            securityUserBo = SessionUtil.getSessionUser();
            //创建人
            apiDatabaseModel.setCreateBy(securityUserBo.getId());
            //修改人
            apiDatabaseModel.setUpdateBy(securityUserBo.getId());
            //创建时间
            apiDatabaseModel.setCreateDate(new Date());
            //修改时间
            apiDatabaseModel.setUpdateDate(new Date());
            apiDatabaseModel.setId(IdGenerator.nextId());
        } else if (EnumOperateType.UPDATE == operateType) {
            securityUserBo = SessionUtil.getSessionUser();
            //修改人
            apiDatabaseModel.setUpdateBy(securityUserBo.getId());
            //修改时间
            apiDatabaseModel.setUpdateDate(new Date());
        }
    }
}
